package com.diandi.messages.util;

import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URLDecoder;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 * @author Beyond
 */
public class HttpSender {

	/**
	 * 
	 * @param url
	 *            应用地址，类似于http://ip:port/msg/
	 * @param account
	 *            账号
	 * @param pswd
	 *            密码
	 * @param mobile
	 *            手机号码，多个号码使用","分割
	 * @param msg
	 *            短信内容
	 * @param needstatus
	 *            是否需要状态报告，需要true，不需要false
	 * @return 返回值定义参见HTTP协议文档
	 * @throws Exception
	 */
	public static String send(String url, String account, String pswd, String mobile, String msg, boolean needstatus,
                              String product, String extno) throws Exception {
		HttpClient client = new HttpClient();
		GetMethod method = new GetMethod();
		try {
			URI base = new URI(url, false);
			method.setURI(new URI(base, "HttpSendSM", false));
			method.setQueryString(new NameValuePair[] { new NameValuePair("account", account),
					new NameValuePair("pswd", pswd), new NameValuePair("mobile", mobile),
					new NameValuePair("needstatus", String.valueOf(needstatus)), new NameValuePair("msg", msg),
					new NameValuePair("product", product), new NameValuePair("extno", extno), });
			return getResult(client, method);
		} finally {
			method.releaseConnection();
		}

	}

	/**
	 *
	 * @param url
	 *            应用地址，类似于http://ip:port/msg/
	 * @param map
	 *            参数封装成map
	 * @return 返回值定义参见HTTP协议文档
	 * @throws Exception
	 */
	public static String sendPostByMap(String url, Map<String, String> map) throws Exception {
		HttpClient client = new HttpClient();
		PostMethod method = new PostMethod();
		try {
			URI base = new URI(url, false);
			method.setURI(base);
			if (map != null && !map.isEmpty()) {
				NameValuePair[] params = new NameValuePair[map.size()];
				Set<Map.Entry<String, String>> entrySet = map.entrySet();
				Iterator<Map.Entry<String, String>> it = entrySet.iterator();
				int i = 0;
				while (it.hasNext()) {
					Map.Entry<String, String> entry = it.next();
					params[i] = new NameValuePair(entry.getKey(), entry.getValue());
					i++;
				}
				method.setQueryString(params);
			}
			return getResult(client, method);
		} finally {
			method.releaseConnection();
		}

	}

	private static String getResult(HttpClient client, HttpMethodBase method) throws Exception {
		int result = client.executeMethod(method);
		if (result == HttpStatus.SC_OK) {
			InputStream in = method.getResponseBodyAsStream();
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			byte[] buffer = new byte[1024];
			int len = 0;
			while ((len = in.read(buffer)) != -1) {
				baos.write(buffer, 0, len);
			}
			return URLDecoder.decode(baos.toString(), "UTF-8");
		} else {
			throw new Exception("HTTP ERROR Status: " + method.getStatusCode() + ":" + method.getStatusText());
		}
	}

	/**
	 * 
	 * @param url
	 *            应用地址，类似于http://ip:port/msg/
	 * @param account
	 *            账号
	 * @param pswd
	 *            密码
	 * @param mobile
	 *            手机号码，多个号码使用","分割
	 * @param msg
	 *            短信内容
	 * @param needstatus
	 *            是否需要状态报告，需要true，不需要false
	 * @return 返回值定义参见HTTP协议文档
	 * @throws Exception
	 */
	public static String batchSend(String url, String account, String pswd, String mobile, String msg,
                                   boolean needstatus, String product, String extno) throws Exception {
		HttpClient client = new HttpClient();
		GetMethod method = new GetMethod();
		try {
			URI base = new URI(url, false);
			method.setURI(new URI(base, "HttpBatchSendSM", false));
			method.setQueryString(new NameValuePair[] { new NameValuePair("account", account),
					new NameValuePair("pswd", pswd), new NameValuePair("mobile", mobile),
					new NameValuePair("needstatus", String.valueOf(needstatus)), new NameValuePair("msg", msg),
					new NameValuePair("product", product), new NameValuePair("extno", extno), });
			return getResult(client, method);
		} finally {
			method.releaseConnection();
		}

	}
}
